Skip to content

Commit 4b085d1

Browse files
committed
Delete non-approved revisions on user deletion
* Delete docs without revisions on user deletion
1 parent ecc8595 commit 4b085d1

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

kitsune/wiki/handlers.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,13 @@ def on_user_deletion(self, user: User) -> None:
1919
document.contributors.add(*content_group.user_set.all())
2020
document.contributors.remove(user)
2121

22+
non_approved_revisions = Revision.objects.filter(creator=user, is_approved=False)
23+
# Delete documents with no approved revisions
24+
Document.objects.filter(
25+
current_revision__isnull=True, revisions__in=non_approved_revisions
26+
).delete()
27+
# delete remaining non-approved revisions
28+
non_approved_revisions.delete()
29+
2230
sumo_bot = Profile.get_sumo_bot()
2331
Revision.objects.filter(creator=user).update(creator=sumo_bot)

kitsune/wiki/tests/test_handlers.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
from kitsune.users.models import Profile
55
from kitsune.users.tests import GroupFactory, UserFactory
66
from kitsune.wiki.handlers import DocumentListener
7-
from kitsune.wiki.tests import DocumentFactory
7+
from kitsune.wiki.models import Document, Revision
8+
from kitsune.wiki.tests import DocumentFactory, RevisionFactory
89

910

1011
class TestDocumentListener(TestCase):
@@ -69,3 +70,41 @@ def test_multiple_documents(self):
6970

7071
self.assertTrue(doc3.contributors.filter(id=other_contributor.id).exists())
7172
self.assertEqual(doc3.contributors.count(), 1)
73+
74+
def test_non_approved_revision_handling(self):
75+
"""Test handling of non-approved revisions when a user is deleted."""
76+
doc_to_delete = DocumentFactory(current_revision=None)
77+
RevisionFactory(document=doc_to_delete, creator=self.user, is_approved=False)
78+
79+
doc_to_keep = DocumentFactory()
80+
other_user = UserFactory()
81+
approved_rev = RevisionFactory(document=doc_to_keep, creator=other_user, is_approved=True)
82+
doc_to_keep.current_revision = approved_rev
83+
doc_to_keep.save()
84+
non_approved_rev = RevisionFactory(
85+
document=doc_to_keep, creator=self.user, is_approved=False
86+
)
87+
88+
doc_to_reassign = DocumentFactory()
89+
approved_user_rev = RevisionFactory(
90+
document=doc_to_reassign, creator=self.user, is_approved=True
91+
)
92+
doc_to_reassign.current_revision = approved_user_rev
93+
doc_to_reassign.save()
94+
95+
self.listener.on_user_deletion(self.user)
96+
97+
self.assertFalse(Document.objects.filter(id=doc_to_delete.id).exists())
98+
99+
self.assertTrue(Document.objects.filter(id=doc_to_keep.id).exists())
100+
doc_to_keep.refresh_from_db()
101+
102+
self.assertTrue(Revision.objects.filter(id=approved_rev.id).exists())
103+
104+
self.assertFalse(Revision.objects.filter(id=non_approved_rev.id).exists())
105+
106+
self.assertTrue(Document.objects.filter(id=doc_to_reassign.id).exists())
107+
doc_to_reassign.refresh_from_db()
108+
self.assertEqual(
109+
doc_to_reassign.current_revision.creator.username, settings.SUMO_BOT_USERNAME
110+
)

0 commit comments

Comments
 (0)